{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第一周进阶作业\n",
    "## 1.以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。\n",
    " 答： 实现方法如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2\n",
    "#导入图像\n",
    "img_ori = cv2.imread(r'lean.jpg')\n",
    "cv2.imshow('original', img_ori)\n",
    "\n",
    "# 平均滤波\n",
    "img_mean = cv2.blur(img_ori, (5,5))\n",
    "\n",
    "# 高斯滤波\n",
    "img_Guassian = cv2.GaussianBlur(img_ori,(5,5),0)\n",
    "\n",
    "# 中值滤波\n",
    "img_medianBlur = cv2.medianBlur(img_ori, 5)\n",
    "\n",
    "cv2.imshow('mean', img_mean)\n",
    "cv2.imshow('guassian', img_Guassian)\n",
    "cv2.imshow('medianBlur', img_medianBlur)\n",
    "cv2.waitKey()\n",
    "cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上从结果可以看出原图经过滤波以后会变得模糊，这印证了滤波后会损失一些原有的信息，根据结果也能看出高斯滤波的清晰程度大于中值滤波大于平均滤波。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 以Lena为原始图像，通过OpenCV使用Sobel及Canny算子检测，比较边缘检测结果。\n",
    "答：实现代码如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2\n",
    "#导入图像\n",
    "img_ori = cv2.imread(r'lean.jpg')\n",
    "cv2.imshow('original', img_ori)\n",
    "img_gray = cv2.cvtColor(img_ori,cv2.COLOR_RGB2GRAY)\n",
    "cv2.imshow('gray', img_gray)\n",
    "\n",
    "# Sobel算子\n",
    "# x方向\n",
    "img_sobelx_gray = cv2.Sobel(img_gray, -1, 1,0)\n",
    "# y方向\n",
    "img_sobely_gray = cv2.Sobel(img_gray, -1, 0,1)\n",
    "# 合并x方向和y方向的结果\n",
    "img_sobel_gray_result = cv2.addWeighted(img_sobelx_gray,0.5,img_sobely_gray,0.5,0) #将xy两个方向上的图叠起来 \n",
    "\n",
    "cv2.imshow('img_sobelx_gray', img_sobelx_gray)\n",
    "cv2.imshow('img_sobely_gray', img_sobely_gray)\n",
    "cv2.imshow('img_sobel_gray_result', img_sobel_gray_result)\n",
    "\n",
    "# Canny 算子\n",
    "\n",
    "canny = cv2.Canny(img_gray, 50, 150)\n",
    "cv2.imshow('img_canny', canny)\n",
    "cv2.waitKey()\n",
    "cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据结果可以得出Canny算子边缘检测的效果要明显好于Sobel算子。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 在OpenCV安装目录下找到课程对应演示图片(安装目录\\sources\\samples\\data)，首先计算灰度直方图，进一步使用大津算法进行分割，并比较分析分割结果。 \n",
    "\n",
    "答：代码如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rruu9K5NvlJVnnzySQYOHMjAgaU/fmbNmkWDBg147733SExMpFOnTmzZsoVLL7202vUGU7169ahbt6717CuxatUq6tSpUzqnUZ06dXx+bc+ePdm1axd9+vRh7969Vb/ABMV5nWevqoNV9TCuA7JrgCtV9ZC3tvMtNBqdT88eYOjQoaSkpDB37lzmzZtHbGwsH330UZWvKywsJCcnp/TrRYsW8cgjjzBlypTSA255eXnMnTuXiRMnlt55qlOnTgAhH/bg+p5az/5cxcXF/OIXv+DFF1/k0ksvJT4+vsbratGiBT/88IMfqzPnwy8XVanqQVV9X1VzK2sz1eMJoyZNmpzXetq2bcuoUaMYOHAg8+bNq3TZw4cP069fP9q0acP111/P6dOnefDBB6lbty5btmzh/fddJ1k999xznD59+qzTKy+//HLq1atH//79z6veYGjatKmFvRcff/wxc+fOZdKkSbz44ovnta6WLVta2IcQu4I2hP3www+kpKRUObWxr0aNGsW3335b6dwld955Jzt27GD8+PHMmzeP3/72t3z77be88sordOvWjWnTpjFnzhxeeOEFxo0bx0UXXVT62pEjR1JYWHjeH07B0KxZMxvG8eJvf/sbLVu25MUXXyz9S62mWrRoQWFhISdPnvRTdeZ8WNiHsJycHNq0aeO39Y0bN47k5GTuueceMjMzz5k757vvvuOdd97h4YcfZtasWdSpU4dnnnmG5s2bM3bsWObMmUNCQgJjx46lpKSEGTPOvjhaRPz2wRRo1rM/V3Z2NosXL2bq1KnnNXzj0bJlS8B1tzLjPAv7EJaTk1N6VoM/NG3alP/6r/9i2bJl9OjRg4kTJ1JSUsK8efO49957mTFjBrVq1eK+++6jXr16jBkzBoDbbruNuLg4OnbsyFdffcVHH33Ejh07qrzAJpQ1a9aMAwcOUFRU5HQpIWPlypWA6y9Af2jRogWAHaQNETaffYhSVXbt2uX3e7befvvtnDp1iuXLl/P+++9zww03MHfu3NLnb7755tJhmHvuuYe1a9eeNUVxs2bNuO666/xakxPat28PuG6bWNV8L9EiIyOD2rVr++1D3NOzt3H70GA9+xB16NAhjh496tdhHHANtdxzzz08//zz1KpVi7lz53LvvfeSk5PD/fffz+OPP1667KWXXsqWLVtITU31aw2hYPjw4T6f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7jk9ePCg/vjjj7pixQqdOXOmlpSUVFjjP//5z7NqfOGFFwLyvfCX6dOna3x8vBYVFTldStgD1qkvOe3LQsH4F+1hX1JSosnJyXr33Xc7XYop57333tO7775bN23apKtWrdKUlBRNSUnR2rVra5s2bTQ+Pl6nT59euvw333yjjRs31rS0NC0uLi5t//DDD/Wtt97SyZMnK6A33nijAhobG6sxMTH65JNPqqpqx44ddfjw4dqhQwdNSEjQmJgYBfSzzz7T4uJiffDBB3XWrFln1ThlyhRNSkrSVq1aab169fTQoUPB+ebUkOfDKTMz0+lSwp6FfZgpKCgo7dGZ0LZ582bt0KGDduvWrbQn/e677561zCuvvKKAbtq0SVVVDx48qHXr1i1dXkQU0B49eujy5cv1q6++Kn3t3XffXbrcddddpw8++KA2aNBAx40bpzNnzix97vrrr9cJEyZobm6udu7cWUeMGKGLFy/WuXPnBvX7URMbNmxQQN9++22nSwl7voa9DQ6HCDsTJ3xcdNFFbNmyheLiYtq2bcuePXtKD+R6eE5v/J//+R/++Mc/UlJSwrFjx5g0aRKHDx8mPT2d3/72t4wfP54BA86+DGXYsGH87W9/o0WLFnz44YfEx8dTVFTEX//6V959911+8YtfEBMTw9KlSzl27Bjz5s3jyJEjTJw4kWHDhgXt+3A+OnXqRFxcHJmZmYwfP97pcqKChX2I+P777wFsqoQwISLExcXx8MMP8/LLL5/zId2+fXuaNWvGY489xokTJwDXnPmvv/46ACdOnKC4uJg777zznHVfeeWVJCUlcd999xEfHw/Afffdx9q1axk1ahTTpk0jMdF1ZvP69et59tln6dixI1OnTg3kLvtVrVq1uOiii+wgbRCJ668A56Wnp+u6deucLsMxDz30EH/5y184duyYnY0TIW688UY++OADBg0axOjRo7nqqqvo0qWLT6/98ccfSU5OjugJ8X75y1+yatUqsrOznS4lrIlIhqqmV7WcXewUIjZs2EDXrl0t6CPIoEGDAHjwwQf59a9/7XPQg2uOnkgOeoDu3buza9cuDh065HQpUcHCPkRs2LCBnj17Ol2G8aPJkyczd+5crrnmGqdLCUndu3cHbOqEYLGwDwH79+9n//79FvYRJjExkeuvvz7ie+g15Ql7G7cPDgv7ELBx40YAevTo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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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yZIlwNGja+pW9uA5qmXhwoWMHz+e1157jRkzZvDRRx/x3nvvtWp94dKjRw/69evHt771LTZu3IiqMnv2bFauXMmXX34Z9Ttu9+/fz3333cfnn3/OjTfeyM0331xvekpKCpmZmYgIo0aNAuDCCy/k4osvZt68eQCuuKdCVFLVDvEYOXKkmqZlZWXphRde6Ne8w4cP13Hjxvm97JqaGr3mmmsU0IEDB+qePXu0f//+evzxx2t5eXm9eW+77TYFdOzYsbp06VI9dOhQq7ajo7j77rs1Li5OZ8+erYAOHjxYzz77bAX0X//6V7i71+4OHDhaVfLPAAAPc0lEQVSgd999t/75z39WQFetWtXie44cOaJTpkzRc845R/v166epqan64IMPanx8vObl5bVDr42qKpCjfmRs2EPe+7Cwb95JJ52kV1xxhV/z/uxnP9OEhATds2ePPvjgg/rCCy80O//MmTMV0AsvvFAB7dGjh8bGxurq1asbzTtv3jyNj4/XjRs3BrQdHcUrr7yiQO0XnPd5UlKSZmZm6q5du8LdxaCrqKjQbdu21Wt766239LHHHtOHHnpIAY2Pj9eMjAytrq5u1bI3btxY+38I6IsvvhjMrptmWNhHmAEDBujVV1/t17zvvvtu7QcX0GOPPbbJeV9//XUFdNq0aVpdXa0TJ07UE088URcuXOhz/qqqKt2zZ08gm9ChlJeX6/z583XevHlaVFSkxxxzjHbr1k1XrFihqampeswxx+iOHTt0/vz5+vTTT4e7u0Hx+OOPa2xsrG7YsEFVPX/RnXjiiSoi2qdPH42NjVVAr7nmmoCWP3HiRBURjYuL05/97GfB7LpphoV9hOnevbvedNNNfs17+PBhveKKK/Smm27SH/3oRwpoSUmJz3nPP/98HTBggFZWVqqqJwCi0fr162uHLtasWaOA/u53v9PMzEzt2rWrVlRUhLmHbXfFFVcooOeee67edtttOm/evHrV+P/93//pD37wA59/0fnj66+/1oULF+ro0aP1nHPOCXLvTVMs7CNMUlKS/vznP2/1+1577TUF9D//+U+jabm5uSoiOnPmzCD0MLIMHz5chwwZUhuE7777bri71CY1NTXat29fTUtLqxfwsbGx+pvf/EZ79uypBw4cCMq6brnlFk1LS9OqqqqgLM80z9+wt6NxXKC6upojR44EdGjjsGHDAN93aXryyScBmDZtWts6GIGys7NrLxcRFxfHK6+8Qn5+PlOnTuV///d/2blzZ6P3fPbZZ7XXMHrjjTe4+eabqaqqanId5eXloel8A0VFRXzxxRfs2rWL++67j3nz5rF06VLS0tKYOHEiM2fOpKCggM6dOwdlfVlZWZSWltZeW8l0EP58I9R9AJ2Bd4DFwKtAApAHrHAepzjzzQLWAk/4s1yr7JtWVFSkgD788MOtfm91dbWmpKTo7bffXq9969atmpCQoFOmTAlWNyPKv/71LwW0e/fuOnXqVE1MTNR+/fppUlKSxsfH66hRo/TRRx/Vq6++Wg8dOqRbt27V2NhYPfvss/Wee+6prZy94+Ne1dXVum/fPi0sLNQuXbro9773PS0uLm60/nXr1unu3buDsi2nnXaaJiUlKaDr1q2rbd++fbt+8803QVlHXZs2bVJA//rXvwZ92aYxQjWMA9wEnO88fxL4NfCHBvOMBJYCAswEJjSxrBlADpAzYMCA9vh/caWtW7cqoAsWLAjo/aNGjdLx48erqufPee+O2LS0NN25c2cwuxox9u3bp4B+97vf1YKCAp0yZYr26NFD33//ff373/9ebyhk0qRJOnXq1NodnIBecsklCjTaufvQQw9pamqq3nfffQqoiDTaIVpcXKwpKSk6adKkNm/Htm3bavuUkpJSu28mlLxDRldeeWXI12X8D/tWXxtHVf9c52UGsAO4WETGAZ8ANwDnAv9UVRWRRcCFQKOzblT1KeApgKysLG1tX6KF94Jdgd6/ddiwYbz66qs88MADPPzwwxx33HGsWbOGOXPm0Ldv32B2NWJ0796dRx55hDPOOINevXrx/PPPo6qICKrKqlWrqKmp4YQTTuDWW2+lpqaGG264gdNOO42kpCSmTp1Kly5d2LBhA+Xl5RQUFNC3b1/+8pe/UFZWxqxZsxg0aBDjxo3j73//O/feey9z586loKCAYcOGcejQId555x3y8vIYMGAA4P+JdXW98847gOfM4aSkpBavmhoMIsLEiRN5/fXXqa6uJjY2NuTrNH7w5xvB1wM4A0/1Pgro47Q9C3wH+BVwqdM2BJjT0vJsGKdpb775pgK6Zs2agN6/atUq7dmzpwL6rW99S5OSknTKlClRe+RNsOXk5Oh1112n+fn59drPPvtsHTp0qPbr108BHTBggALatWtXBfTO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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import cv2\n",
    "import matplotlib.pyplot as plt\n",
    "# 显示中文\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus']=False\n",
    "\n",
    "#导入图像\n",
    "rice_img = cv2.imread(r'rice.jpg')\n",
    "# 转换为灰度图像\n",
    "rice_img_gray = cv2.cvtColor(rice_img, cv2.COLOR_RGB2GRAY)\n",
    "cv2.imshow(\"rice_original\", rice_img_gray)\n",
    "# 计算灰度直方图\n",
    "dst = cv2.calcHist([rice_img_gray],[0],None,[256],[0,255])\n",
    "plt.title(\"灰度直方图\")\n",
    "plt.plot(dst, color='black')\n",
    "plt.show()\n",
    "retval, dst = cv2.threshold(rice_img_gray, 0, 255, cv2.THRESH_OTSU)\n",
    "cv2.imshow('otsu', dst)\n",
    "\n",
    "# 添加了高斯滤波大津算法\n",
    "rice_img_Gaussian = cv2.GaussianBlur(rice_img_gray, (5,5), 0)\n",
    "# 计算灰度直方图\n",
    "dst = cv2.calcHist([rice_img_Gaussian],[0],None,[256],[0,255])\n",
    "plt.title(\"灰度直方图_高斯\")\n",
    "plt.plot(dst, color='black')\n",
    "plt.show()\n",
    "retval, dstl = cv2.threshold(rice_img_Gaussian, 0, 255, cv2.THRESH_OTSU)\n",
    "cv2.imshow('otsu_gaussian', dstl)\n",
    "\n",
    "cv2.waitKey()\n",
    "cv2.destroyAllWindows()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的结果可以看出大津算法并没有检测出图像中靠近下部边缘的米粒，这个原因可能是因为光线原因。另外发现，增加高斯滤波后，消除了图像中的一些噪音，增强了图像分割的准确性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 使用米粒图像，分割得到各米粒，首先计算各区域(米粒)的面积、长度等信息，进一步计算面积、长度的均值及方差，分析落在3sigma范围内米粒的数量。\n",
    "答：代码如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "米粒面积的平均值，方差，标准差分别是:\n",
      " 187.38690476190476 17184.317566609978 131.0889681346603\n",
      "面积落在3sigma范围内的米粒占比为: 0.9642857142857143\n",
      "米粒周长的平均值，方差，标准差分别是:\n",
      " 67.09825486370495 1146.8214039851237 33.864751645112115\n",
      "周长落在3sigma范围内的米粒占比为: 0.9642857142857143\n"
     ]
    }
   ],
   "source": [
    "import cv2\n",
    "import numpy as np\n",
    "rice_img = cv2.imread(r'rice.jpg')\n",
    "# 把图像转换为灰度图像\n",
    "rice_img_gray = cv2.cvtColor(rice_img, cv2.COLOR_RGB2GRAY)\n",
    "# 高斯滤波\n",
    "rice_img_gaussian = cv2.GaussianBlur(rice_img_gray, (5,5), 0)\n",
    "# 大津算法做图像分割\n",
    "retval, dstl = cv2.threshold(rice_img_gaussian, 0, 255, cv2.THRESH_OTSU)\n",
    "# 找到分割后的轮廓，以list形式存在contours中\n",
    "img, contours, hierarchy = cv2.findContours(dstl, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n",
    "# 分别用两个list来记录每粒米的面积和长度，做统计使用\n",
    "arr_area = []\n",
    "arr_length = []\n",
    "#遍历所有轮廓\n",
    "for i in range(len(contours), 0, -1):\n",
    "    c = contours[i - 1]\n",
    "    area = cv2.contourArea(c) # 计算面积\n",
    "    \n",
    "    #太小的米粒认为是噪声点\n",
    "    if area < 10:\n",
    "        continue\n",
    "    leng = cv2.arcLength(c, 1)\n",
    "    # 把检测到的米粒长度和面积放入数组中以便后续统计\n",
    "    arr_area.append(area)\n",
    "    arr_length.append(leng)\n",
    "\n",
    "    # 在原图上用图像分割的结果标记\n",
    "    x, y, w, h = cv2.boundingRect(c)\n",
    "    cv2.rectangle(rice_img_gaussian, (x, y), (x + w, y + h), (0, 0, 255), 1)\n",
    "    # 对图像进行标记\n",
    "    cv2.putText(rice_img_gaussian, str(i), (x,y), cv2.FONT_HERSHEY_PLAIN, 0.5, (0, 255, 0))\n",
    "\n",
    "    \n",
    "# 面积的均值和方差：\n",
    "mean_area = np.mean(arr_area)\n",
    "dev_area = np.var(arr_area)\n",
    "std_area = np.std(arr_area)\n",
    "\n",
    "#计算落在3sigma范围内的米粒\n",
    "area_count = 0\n",
    "for area in arr_area:\n",
    "    if area < mean_area + 3 * std_area and area > mean_area - 3* std_area:\n",
    "        area_count += 1\n",
    "print(\"米粒面积的平均值，方差，标准差分别是:\\n\", mean_area, dev_area, std_area)\n",
    "print(\"面积落在3sigma范围内的米粒占比为:\", area_count / len(arr_area))\n",
    "\n",
    "# 长度的均值和方差：\n",
    "mean_length = np.mean(arr_length)\n",
    "dev_length = np.var(arr_length)\n",
    "std_length = np.std(arr_length)\n",
    "\n",
    "#计算落在3sigma范围内的米粒\n",
    "length_count = 0\n",
    "for length in arr_length:\n",
    "    if length < mean_length + 3 * std_length and area > mean_length - 3* std_length:\n",
    "        length_count += 1\n",
    "\n",
    "print(\"米粒周长的平均值，方差，标准差分别是:\\n\", mean_length, dev_length, std_length)\n",
    "print(\"周长落在3sigma范围内的米粒占比为:\", length_count / len(arr_length))\n",
    "\n",
    "cv2.imshow(\"rice_img_gaussian\",rice_img_gaussian)\n",
    "cv2.waitKey()\n",
    "cv2.destroyAllWindows()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
